更高效的利用 Jupyter+pandas 进行数据分析,6 种常用数据格式效率对比!
The following article is from 早起Python Author 刘早起
Jupyter Notebook
是一个非常强力的工具,在数据集不是很大的情况下,我们可以使用pandas轻松对txt
或csv
等纯文本格式数据进行读写。然而当数据集的维度或者体积很大时,将数据保存并加载回内存的过程就会变慢,并且每次启动Jupyter Notebook
时都需要等待一段时间直到数据重新加载, 这样csv格式或任何其他纯文本格式数据都失去了吸引力。
本文将对pandas支持的多种格式数据在处理数据的不同方面进行比较,包含I/O速度
、内存消耗
、磁盘占用空间
等指标,试图找出如何为我们的数据找到一个合适的格式的办法!
格式说明
现在对本文进行对比的几种数据格式进行说明。
CSV
:最常用的数据格式Pickle
:用于序列化和反序列化Python对象结构MessagePack
:类似于json,但是更小更块HDF5
:一种常见的跨平台数据储存文件Feather
:一个快速、轻量级的存储框架Parquet
:Apache Hadoop的列式存储格式
为了找到格式来存储数据,本文选择以下指标进行对比。
size_mb
:带有序列化数据帧的文件的大小save_time
:将数据帧保存到磁盘所需的时间load_time
:将先前转储的数据帧加载到内存所需的时间save_ram_delta_mb
:在数据帧保存过程中最大的内存消耗增长load_ram_delta_mb
:数据帧加载过程中最大的内存消耗增长
对比
现在开始对前文介绍的5种数据格式进行比较,为了更好地控制序列化的数据结构和属性我们将使用自己生成的数据集。下面是生成测试数据的代码,我们随机生成具有数字和分类特征的数据集。数值特征取自标准正态分布。分类特征以基数为C的uuid4随机字符串生成,其中2 <= C <= max_cat_size。dataset, types = {}, {}
def generate_categories():
from uuid import uuid4
category_size = np.random.randint(2, max_cat_size)
return [str(uuid4()) for _ in range(category_size)]
for col in range(num_count):
name = f'n{col}'
values = np.random.normal(0, 1, n_rows)
nan_cnt = np.random.randint(1, int(max_nan*n_rows))
index = np.random.choice(n_rows, nan_cnt, replace=False)
values[index] = np.nan
dataset[name] = values
types[name] = 'float32'
for col in range(cat_count):
name = f'c{col}'
cats = generate_categories()
values = np.array(np.random.choice(cats, n_rows, replace=True), dtype=object)
nan_cnt = np.random.randint(1, int(max_nan*n_rows))
index = np.random.choice(n_rows, nan_cnt, replace=False)
values[index] = np.nan
dataset[name] = values
types[name] = 'object'
return pd.DataFrame(dataset), types
1.将生成的分类变量保留为字符串 2.在执行任何I/O之前将其转换为pandas.Categorical数据类型
1.以字符串作为分类特征
下图显示了每种数据格式的平均I/O时间。这里有趣的发现是hdf的加载速度比csv更低,而其他二进制格式的性能明显更好,而feather
和parquet
则表现的非常好。2. 对特征进行转换
在上一节中,我们没有尝试有效地存储分类特征,而是使用纯字符串,接下来我们使用专用的pandas.Categorical类型再次进行比较。结论
正如我们的上面的测试结果所示,feather格式似乎是在多个Jupyter之间存储数据的理想选择。它显示出很高的I/O速度,不占用磁盘上过多的内存,并且在装回RAM时不需要任何拆包。
当然这种比较并不意味着我们应该在每种情况下都使用这种格式。例如,不希望将feather格式用作长期文件存储。此外,当其他格式发挥最佳效果时,它并未考虑所有可能的情况。所以我们也需要根据具体情况进行选择!
- EOF -
2、增强 Jupyter Notebook 的功能,这里有 4 个妙招
3、Pandas技巧:万能转格式、轻松合并、压缩数据,让数据分析更高效
看完本文有收获?请转发分享给更多人
推荐关注「数据分析与开发」,提升数据技能
点赞和在看就是最大的支持❤️